Reconociendo el Canto de las Aves: CNN y Algoritmos Genéticos en la Extracción de Características de Espectrogramas#
Resumen#
Metodologia#
Descripción de población y muestra#
Para el desarrollo del presente proyecto, se eligió un conjunto de datos que contiene imágenes de espectrogramas previamente procesados, disponibles en el sitio web Kaggle [Naqv, 2023]. Los audios utilizados para generar los espectrogramas, fueron obtenidos del sitio web Xeno-Canto, en el cual se encuentran registros de sonidos de toda clase de fauna alrededor del mundo. Los audios con los cantos de las aves fueron convertidos en espectrogramas utilizando una transformada de Fourier de tamaño 2048 y luego se les aplicó una transformación logarítmica.
Los espectrogramas consisten en una representación visual que muestra cómo se distribuyen las frecuencias en una señal de sonido. Esta representación gráfica puede revelar detalles específicos, como frecuencias elevadas o cambios en la amplitud, que podrían no ser perceptibles incluso si se encuentran dentro del rango auditivo humano [Martínez Mascorro, 2013].
La muestra inicial de datos para este proyecto son espectrogramas es de 152 especies de aves de la población total de especies de aves presentes en Hawaii, y no se tiene información temporal con respecto al momento en que se registraron los audios.
Durante la realización del análisis exploratorio, y por limitaciones para aplicar técnicas de balanceo de datos, se seleccionan como muestra las 6 especies con mayor cantidad de datos.
Fig. 1 Especie Loxops caeruleirostris (Akeke) junto a su espectograma#
Diccionario de variables#
Los datos utilizados en el proyecto son imágenes de espectrogramas de 152 especies de aves presentes en Hawái. Como se verá más adelante, la cantidad de espectrogramas para cada especie no es igual, por lo que estamos ante un conjunto de datos desbalanceado.
Variable dependiente: Etiquetas con la abreviatura del nombre común de las aves.
Variables explicativas: Vector de características extraídas de imágenes de espectrogramas del espectro de frecuencias de la emisión sonora del canto de las aves.
Los espectogramas, se utilizaron para extraer patrones visuales y características importantes presentes en las imágenes, que permitan identificar las especies de aves. Estas caracteristicas son extraidas al momento de implementar los modelos, y no se tienen de antemano.
Algunas de las caracteristicas extraíadas de los espectrogramas por los modelos son:
Estadísticas de color: Los estadísticos de distribución de color son comunes en la recuperación de imágenes, ya que describen la variación de la intensidad del color en una imagen. En el caso de los espectrogramas de sonido, estos estadísticos se aplican a cada imagen monocroma, permitiendo describir cómo varía la intensidad del sonido en regiones definidas en términos de tiempo y frecuencia. [Dennis et al., 2011]
Direccionalidad: La direccionalidad de la imagen es una característica importante para describir la textura de una imagen. Describe la dirección en la que se concentra o dispersa la textura de la imagen. [Shi et al., 2015]
Técnicas#
Para el desarrollo de este modelo se implementaron los siguientes algoritmos de aprendizaje automatico:
Convolutional Neural Network (CNN)
Transferencia de conocimiento con MobileNetV2
Convolutional Neural Network con Algoritmo Genetico (GA)
Diseño general#
El tipo de diseño de investigación utilizado en este trabajo es Mineria de datos. Las etapas consideradas durante el desarrollo del trabajo fueron:
Extracción de datos
Procesamiento de datos
Análisis exploratorio de los datos
Modelado
Evaluación de resultados
Validez#
Resultados y Discusiones#
Exploración de los datos#
Para la exploración de los datos, se utilizaron los audios originales con los cuales se generaron los espectogrmas, ya que estos nos podrian ayudar a entender las diferencias entre los cantos de las aves, y como esto puede ayudar a identificarlas.
Show code cell source
import os
import pandas as pd
import torch
import torchaudio
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import plotly.express as px
import librosa
import librosa.display
import IPython.display as ipd
import sklearn
import warnings
import seaborn as sns
warnings.filterwarnings('ignore')
Show code cell output
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
Cell In[1], line 2
1 import os
----> 2 import pandas as pd
3 import torch
4 import torchaudio
ModuleNotFoundError: No module named 'pandas'
Show code cell source
#Metadata de los audios
train_csv=pd.read_csv('C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train_metadata.csv')
train_csv.head()
| primary_label | secondary_labels | type | latitude | longitude | scientific_name | common_name | author | license | rating | time | url | filename | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | afrsil1 | [] | ['call', 'flight call'] | 12.3910 | -1.4930 | Euodice cantans | African Silverbill | Bram Piot | Creative Commons Attribution-NonCommercial-Sha... | 2.5 | 08:00 | https://www.xeno-canto.org/125458 | afrsil1/XC125458.ogg |
| 1 | afrsil1 | ['houspa', 'redava', 'zebdov'] | ['call'] | 19.8801 | -155.7254 | Euodice cantans | African Silverbill | Dan Lane | Creative Commons Attribution-NonCommercial-Sha... | 3.5 | 08:30 | https://www.xeno-canto.org/175522 | afrsil1/XC175522.ogg |
| 2 | afrsil1 | [] | ['call', 'song'] | 16.2901 | -16.0321 | Euodice cantans | African Silverbill | Bram Piot | Creative Commons Attribution-NonCommercial-Sha... | 4.0 | 11:30 | https://www.xeno-canto.org/177993 | afrsil1/XC177993.ogg |
| 3 | afrsil1 | [] | ['alarm call', 'call'] | 17.0922 | 54.2958 | Euodice cantans | African Silverbill | Oscar Campbell | Creative Commons Attribution-NonCommercial-Sha... | 4.0 | 11:00 | https://www.xeno-canto.org/205893 | afrsil1/XC205893.ogg |
| 4 | afrsil1 | [] | ['flight call'] | 21.4581 | -157.7252 | Euodice cantans | African Silverbill | Ross Gallardy | Creative Commons Attribution-NonCommercial-Sha... | 3.0 | 16:30 | https://www.xeno-canto.org/207431 | afrsil1/XC207431.ogg |
La información de la metadata del conjunto de datos, tiene información sobre el tipo de canto de la especie (llamado, canción, alerta), las coordenadas en las cuales se realizó la grabación del audio, quien fue el autor de la grabación, la duración de la grabación, entre otros datos. Esta información no será utilizada en el modelo, pero permite conocer un poco más sobre el contexto de los audios.
Show code cell source
# Muestra de audios
base_dir = 'C:/Users/kaes1/Desktop/MachineLearningUN/Audios/train_audio'
train_csv['full_path'] = base_dir+ '/' + train_csv['filename']
# train_csv['full_path'] = base_dir+ '/' + train_csv['primary_label'] + '/' + train_csv['filename']
brnowl = train_csv[train_csv['primary_label'] == "brnowl"].sample(1, random_state = 33)['full_path'].values[0]
comsan = train_csv[train_csv['primary_label'] == 'comsan'].sample(1, random_state = 33)['full_path'].values[0]
houspa = train_csv[train_csv['primary_label'] == "houspa"].sample(1, random_state = 33)['full_path'].values[0]
mallar3 = train_csv[train_csv['primary_label'] == 'mallar3'].sample(1, random_state = 33)['full_path'].values[0]
norcar = train_csv[train_csv['primary_label'] == 'norcar'].sample(1, random_state = 33)['full_path'].values[0]
skylar = train_csv[train_csv['primary_label'] == 'skylar'].sample(1, random_state = 33)['full_path'].values[0]
birds= ["brnowl", "comsan", "houspa", "mallar3", "norcar",'skylar']
Muestra de audios
Para entender porque los cantos de las aves pueden ayudar en la identificación de especies, se muestran a continuación algunos ejemplos de audio obtenidos desde el repositorio de Xeno-canto.
ipd.Audio(skylar)
ipd.Audio(houspa)